前一篇我們使用 OpenCV 這個第三方函式庫來當做範例,但並不是每一個第三方函式庫的使用方式都是像OpenCV 一樣,需要使用 find_package 指令找到其自身的設定檔後,才能利用設定檔提供的標頭檔路徑和庫路徑來編譯出執行檔。
像今天介紹的 json 函式庫,它的作法和我們在 Day 14的作法很像,都是把標頭檔和庫文件直接安裝在系統預設的搜索路徑下,雖然有提供 Config.cmake 這個檔案讓使用者用 find_package 指令來尋找,但不使用 find_package 也一樣能夠使用該庫。
那為什麼還要使用 find_package 呢?
因為find_package提供了一個REQUIRED選項,當專案無法找到所需的依賴項時,它會報錯。這個功能的作用是預防使用者在尚未安裝所需的依賴項時進行編譯,因為當編譯過程中發生錯誤時,使用者將被明確告知缺少了哪些需要的依賴項,而不是跳出一堆對Debug沒有幫助的 "... No such file or directory" 錯誤訊息。
$ git clone https://github.com/m11112089/2023_iT_CMake.git
$ cd ~/2023_iT_CMake/Day21
$ git clone https://github.com/nlohmann/json
$ cd json
$ mkdir build
$ cd build
$ cmake ..
$ make -j4
$ sudo make install
在 CMakeLists.txt 中,我們並沒有將 nlohmann_json 的頭文件路徑與庫文件路徑加入搜索路徑中。和Day 20相比,少了以下這兩行。
include_directories(${OpenCV_INCLUDE_DIRS})
# 將 OpenCV 的 include 路徑加入到專案中
target_link_libraries(main ${OpenCV_LIBS})
# 將 OpenCV 的 library 路徑加入到專案中
cmake_minimum_required(VERSION 3.22)
# 根據自己的cmake版本來設定最小版本,要小於當前版本
project(cmake_tutorial VERSION 1.0.0 LANGUAGES CXX)
# 設定專案名稱為cmake_totorial,版本為1.0.0,且此項目使用C++
find_package(nlohmann_json REQUIRED)
# 尋找 OpenCV 這個第三方庫,REQUIRED 代表如果沒找到就會報錯
message(STATUS "OpenCV library status:")
message(STATUS "version: ${nlohmann_json_VERSION}")
message(STATUS "libraries: ${nlohmann_json_LIBS}")
message(STATUS "include path: ${nlohmann_json_INCLUDE_DIRS}")
add_executable(main src/main.cpp)
# 將 main.cpp 編譯成可執行文件 main
configure_file(version.h.in version.h)
# 將version.h.in輸出成version.h
target_include_directories(main PUBLIC "${PROJECT_BINARY_DIR}")
# 將PROJECT_BINARY_DIR加入main的include路徑,使main可以include到 build/version.h
P.S. 可以把 find_package(nlohmann_json REQUIRED) 這一行註解掉,會發現一樣能夠編譯。
$ cd build
$ cmake ..
可以看到,雖然 find_package() 在 /usr/local/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake 有找到 nlohmann_json 的設定檔 ,但是它並沒有像 OpenCV 一樣有設定可使用的標頭檔路徑與庫路徑。
kai@esoc:~/2023_iT_CMake/Day21/Main/build$ cmake ..
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found nlohmann_json: /usr/local/share/cmake/nlohmann_json/
nlohmann_jsonConfig.cmake (found version "3.11.2") <-----在這找到設定檔 ⭐
-- OpenCV library status:
-- version: 3.11.2
-- libraries: <-----沒有庫路徑 ⭐
-- include path: <-----沒有標頭檔路徑 ⭐
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kai/2023_iT_CMake/Day21/Main/build
$ make
$ ./main ../json/test.json
會顯示出 test.json 的內容。
kai@esoc:~/2023_iT_CMake/Day21/Main/build$ ./main ../json/test.json
{"happy":true,"pi":3.141}